/* eslint-disable camelcase */
// axios 封装
// 1. 基地址
// 2. 请求拦截器
// 3. 响应拦截器
// 封装axios
import store from '@/store'
import history from './history'

import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import { getToken, hasToken } from './storage'
import { saveToken } from '@/store/actions/login'
const baseURL = 'http://geek.itheima.net/v1_0/'
const instance = axios.create({
  baseURL,
  timeout: 60000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    if (hasToken()) {
      const token = getToken().token
      // 添加到请求头
      config.headers!.Authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<{message:string}>) {
    if (!error.response) {
      Toast.show('网络异常')
      return Promise.reject(error)
    }

    if (error.response.status !== 401) {
      Toast.show('操作异常')
      return Promise.reject(error)
    }

    if (error.response.status === 401) {
      console.dir(error.config)
      // 1.检查是否有refresh_token
      const { refresh_token } = getToken()
      if (refresh_token) {
        try {
          // 重发请求拿新的token
          const res = await axios.put(baseURL + 'authorizations', null, {
            headers: {
              Authorization: `Bearer ${refresh_token}`
            }
          })
          store.dispatch(saveToken({ token: res.data.data.token, refresh_token }))
          // 重发请求
          return instance(error.config)
        } catch (e) {
          // refresh_token也过期了
          // 1. 去到登录页
          history.replace('/login', { from: history.location.pathname })
          // 2. 清空token
          store.dispatch(saveToken({ token: '', refresh_token: '' }))
          return Promise.reject(error)
        }
      } else {
        // 没有refresh_token
        // 1. 去到登录页
        history.replace('/login', { from: history.location.pathname })
        // 2. 清空token
        store.dispatch(saveToken({ token: '', refresh_token: '' }))
        return Promise.reject(error)
      }
    }

    // console.dir(error)
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export default instance
